package com.amin.concurrent;

import java.util.concurrent.*;

import org.junit.Test;

public class ExecutorServiceDemo {
	/*
	 * corePoolSize,核心线程数量。核心线程会一直创建，一直到设定的阈值为止，此外，只要线程池不关闭， 核心线程就永远不销毁
	 * maximumPoolSize：最大线程数量=核心线程数量+临时线程数量。注意，临时线程的产生条件：当队列满了之后还没有闲置线程，会创建临时线程
	 * keepAliveTime：这个时间指的是临时线程闲置的时间，一旦超过，临时线程就会被销毁unit：时间单位
	 * workqueue:阻塞队列，作用是启动缓冲和请求等待的作用。
	 */
	@Test
	public void testCreate() {
		ExecutorService es = new ThreadPoolExecutor(5, 10, 3000, TimeUnit.MILLISECONDS,
				new ArrayBlockingQueue<Runnable>(5), new RejectedExecutionHandler() {
					// 当有处理不了的线程进来时，进入到rejectedExecution（）方法里
					public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
						System.out.println("当前线程池已满");

					}
				});
		for (int i = 0; i < 16; i++) {
			es.submit(new ThreadRunner());
			// es.execute(new ThreadRunner());

		}
		// 关闭线程池的方法。注意：不会马上关闭，会等到所有线程都工作完之后才关闭
		// 此外，在调用shutdown后，不会再接收新的请求
		es.shutdown();
	}

	class ThreadRunner implements Runnable {
		public void run() {
			System.out.println("线程被处理");
			try {
				Thread.sleep(Integer.MAX_VALUE);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/*
	 * (0, Integer.MAX_VALUE,60L,TimeUnit.SECONDS, new
	 * SynchronousQueue<Runnable>()) 没有核心线程，临时线程无限大，存活时间是60s,同步队列（只能容纳一个线程）
	 * 大池子小队列 优点（适用场景）：适用于高访问量、高并发的场景（短请求）。用户请求不需要等待排队，能够快速响应用户请求
	 * 隐患：可能会出现线程的频繁创建和销毁。此外，如果用户的请求都是长请求，可能会发生内存溢出的场景
	 */

	public void testCachePool() {
		ExecutorService es = Executors.newCachedThreadPool();
	}

	/*
	 * nThreads, nThreads,0L, TimeUnit.MILLISECONDS, new
	 * LinkedBlockingQueue<Runnable>() 有核心线程，数量等于用户指定数量 核心线程=最大线程，所以没有临时线程
	 * 队列是无界的（大队列）小池子大队列优点（适用场景）：用于缓解服务器压力局限性：用户可能需要等待，响应时间不好。
	 */
	public void testFixed() {
		ExecutorService es = Executors.newFixedThreadPool(10);
	}
}
